//////////////////////////////////////////////////////////////////////////

#ifndef _MEMORYCONTROLLER_H_
#define _MEMORYCONTROLLER_H_

//////////////////////////////////////////////////////////////////////////

#ifdef _DEBUG
#include <set>
#endif

//////////////////////////////////////////////////////////////////////////


/** Memory controller. Checks dynamic memory allocation and deallocation
*
*  @author   Anastasia Karpinska
*  @since    Nov 29th, 2009
*  @updated  Nov 29th, 2009
*/
class MemoryController
{
//////////////////////////////////////////////////////////////////////////

#ifdef _DEBUG

//////////////////////////////////////////////////////////////////////////

public:

//////////////////////////////////////////////////////////////////////////


    /** Destructor */
    virtual ~MemoryController() {}


    /** Operator new overloading, saves pointer */
    void* operator new (size_t _size);


    /** Operator delete overloading, removes pointer */
    void operator delete(void* _ptr);


//////////////////////////////////////////////////////////////////////////

private:

//////////////////////////////////////////////////////////////////////////


    /** Static objects, contains info about allocated memory */
    static struct AllocMemory
    {
        /** Destructor, checks for memory leaks */
        ~AllocMemory();


        /** Allocated memory */
        std::set<void*> m_Allocated;

    } m_AllocMemory;


//////////////////////////////////////////////////////////////////////////

#endif

//////////////////////////////////////////////////////////////////////////
};

//////////////////////////////////////////////////////////////////////////

#endif // _MEMORYCONTROLLER_H_
